import axios from "axios";
import qs from "qs";

// 设置 baseUrl
switch (process.env.NODE_ENV) {
  case "production":
    axios.defaults.baseURL = "http://www.online.com";
    break;
  case "test":
    axios.defaults.baseURL = "http://192.168.162.60";
    break;
  default:
    axios.defaults.baseURL = "http://127.0.0.1";
    break;
}

// 设置超时时间
axios.defaults.timeout = 10000;

// 跨域是否允许携带凭证
axios.defaults.withCredentials = true;

/*
 * 设置 POST 请求数据传递的格式  id=123&name=bbb
 * content-Type: x-www-form-urlencoded
 */
axios.defaults.headers["Content-Type"] = "application/x-www-form-urlencoded";
axios.defaults.transformRequest = (data) => qs.stringify(data);

/**
 * 设置请求拦截器
 * 客户发送请求 -> 请求拦截器 -> 服务器
 * TOKEN 校验 (JWT)
 */
axios.interceptors.request.use(
  (config) => {
    // 携带 token
    let token = localStorage.getItem("token");
    token && (config.headers.Authorization = token);
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * 设置响应拦截器
 */
axios.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    return response;
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    const { response } = error;
    if (response) {
      // 服务器有响应
      switch (response.status) {
        case 401:
          // 没有权限，重新登录，跳转到登录页
          break;
        case 403:
          // 服务器接受请求，拒绝执行，TOKEN 过期
          break;
        case 404:
          // 找不到地址，提示当前接口不存在
          break;
        default:
          break;
      }
    } else {
      // 服务器没有响应
      if (!window.navigator.onLine) {
        // 断网处理，跳转到断网页面
        return;
      }
      return Promise.reject(error);
    }
  }
);

export default axios;
